package com.unbox.common.util;

import lombok.extern.log4j.Log4j2;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.HttpHeaders;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.metadata.TikaMetadataKeys;
import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.*;
import java.util.Date;
import java.util.HashMap;

/**
 * 文件工具包
 */
@Log4j2
public class FileUitl {

    /**
     * 时间戳生成文件名称
     * @param suffix
     * @return
     */
    public static String getFileNameDateRandom(String suffix) {
       Long times = System.currentTimeMillis();
       return suffix+"/"+times+"."+suffix;
    }

    /**
     * 时间戳生成文件名称
     * @param suffix
     * @return
     */
    public static String getNameDateRandomFolder(String suffix) {
        return suffix+"/";
    }

    /**
     * 时间戳生成文件名称
     * @param suffix
     * @return
     */
    public static String getFileNameDateRandomFolderFile(String suffix) {
        Long times = System.currentTimeMillis();
        return times+"."+suffix;
    }

    /**
     * 保存本地文件
     * @param inputStream
     * @param fileUrl
     * @param fileName
     */
    public static void savePic(InputStream inputStream, String fileUrl, String fileName) {
        OutputStream os = null;
        try {
            File file = new File(fileUrl);
            if (!file.exists()) {
                file.mkdirs();
            }
            String path = fileUrl;
            // 2、保存到临时文件
            // 1K的数据缓冲
            byte[] bs = new byte[1024];
            // 读取到的数据长度
            int len;
            // 输出的文件流保存到本地文件

            File tempFile = new File(path);
            if (!tempFile.exists()) {
                tempFile.mkdirs();
            }
            os = new FileOutputStream(tempFile.getPath() + File.separator + fileName);
            // 开始读取
            while ((len = inputStream.read(bs)) != -1) {
                os.write(bs, 0, len);
            }

        } catch (IOException e) {
            log.error(e);
        } catch (Exception e) {
            log.error(e);
        } finally {
            // 完毕，关闭所有链接
            try {
                inputStream.close();
                os.close();
            } catch (IOException e) {
                log.error(e);
            }
        }
    }

    /**
     * 获得文件类型
     * @param fileDatas 文件流
     * @param name 文件名称
     * @return
     */
    public static String getMimeType(byte[] fileDatas, String name) {
        AutoDetectParser parser = new AutoDetectParser();
        parser.setParsers(new HashMap<MediaType, Parser>());
        Metadata metadata = new Metadata();
        metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, name);
        try (InputStream stream = new ByteArrayInputStream(fileDatas)){
            parser.parse(stream, new DefaultHandler(), metadata, new ParseContext());
        } catch (TikaException | SAXException | IOException e) {
            e.printStackTrace();
        }
        return metadata.get(HttpHeaders.CONTENT_TYPE);
    }
}
